home *** CD-ROM | disk | FTP | other *** search
/ Atari Forever 4 / Atari Forever 4.zip / Atari Forever 4.iso / PD_THEMA / EDITOREN / 7UP_PD / SEPROTO.H < prev    next >
Text File  |  1998-03-14  |  15KB  |  347 lines

  1. /* SE-Protokoll zur Kommunikation zwischen Shells zur Programmentwicklung
  2.  * und Editoren. (c) DIRK STEINS @K2.MAUS.DE
  3.  *
  4.  * Dieses Protokoll dient dazu, unter Multitasking-Systemen die Shell
  5.  * zur Compilierung und ähnlichen Sachen zu veranlassen, und um Fehler-
  6.  * meldungen und/oder Fehlerdateien an den Editor zurückzugeben.
  7.  *
  8.  * Kommandos bzw. Nachrichten von der Shell zum Editor beginnen
  9.  * mit SE_, Nachrichten vom Editor zur Shell beginnen mit ES_
  10.  *
  11.  * Da teilweise Zeiger auf Speicherbereiche übergeben werden, ist vom
  12.  * jeweiligen Absender der Nachricht darauf zu achten, daß diese
  13.  * Speicherbereiche vom Empfänger auch lesbar sind (Memory Protection!).
  14.  * Dafür sind diese als Readable zu allozieren!
  15.  *
  16.  * Version  Datum       Änderungen
  17.  * =====================================================================
  18.  *   0.1    10.1.94     Erster Entwurf
  19.  *   0.2    17.1.94     SE_TERMINATE hinzugefügt
  20.  */
  21.  
  22. #define SE_INIT 0x4200
  23.     /* Die Shell fragt an, ob ein Editor das SE-Protokoll
  24.      * versteht.
  25.      * Wort 3: Ein Bitset, welche Nachrichten die Shell versendet
  26.      * Wort 4+5: Ein Bitset, welche Editorkommandos verstanden werden
  27.      * Wort 6: Unterstütze Versionsnummer des Protokolls
  28.      * Als Antwort erhält es ein ES_OK vom  Editor.
  29.      */
  30. #define SE_OK 0x4201
  31.     /* Die Shell sagt dem Editor, das sie das Protokoll
  32.      * versteht.
  33.      * Wort 3: Ein Bitset, welche Nachrichten die Shell versendet
  34.      * Wort 4+5: Ein Bitset, welche Editorkommandos verstanden werden
  35.      * Wort 6: Unterstütze Versionsnummer des Protokolls
  36.      * Wort 7: Die ApId des Programmes, dessen Nachricht beantwortet wird
  37.      */
  38. #define SE_ACK 0x4202
  39.     /* Die Shell bestätigt den Empfang eines Editorkommandos und gibt
  40.      * zurück, ob das Kommando ausgeführt wird.
  41.      * Wort 3: TRUE: Kommando wird verstanden und ausgeführt.
  42.      *         FALSE: Das Kommando wird nicht verstanden
  43.      * Eine SE_ACK mit TRUE sagt nichts darüber aus, ob das Kommando erfolg-
  44.      * reich ausgeführt wurde. Es sagt nur, daß die Shell das Kommando
  45.      * versteht und ausführen wird!
  46.      */
  47. #define SE_OPEN 0x4203
  48.     /* Die Shell sagt dem Editor, daß er einen Text öffnen
  49.      * soll. Als Antwort erhält die Shell ein ES_ACK
  50.      * Wort 3+4: Ein Zeiger auf den Filenamen des zu öffnenden Files
  51.      */
  52. #define SE_ERROR 0x4204
  53.     /* Es ist ein Fehler beim Compilieren aufgetreten.
  54.      * Wort 3+4: Ein Zeiger auf eine Infostruktur, die wie folgt
  55.      *           aufgebaut ist:
  56.      *           Wort 0+1: Ein Zeiger auf den Namen des compilierten Textes.
  57.      *           Wort 2+3: Ein Zeiger auf den Text der Fehlermeldung
  58.      *           Wort 4  : Die Fehlernummer
  59.      *           Wort 5  : Die Fehlerspalte
  60.      *           Wort 6+7: Die Fehlerzeile
  61.      * Mit ES_ACK bestätigt der Editor die Meldung.
  62.      */
  63. #define SE_ERRFILE 0x4205
  64.     /* Es sind Fehler aufgetreten. Die Fehlermeldungen stehen in einem
  65.      * Errorfile, welches in der Message spezifiziert wird.
  66.      * Wort 3+4: Ein Zeiger auf den Filenamen des Errorfiles mit den
  67.      *           Fehlermeldungen
  68.      * Wort 5+6: Ein Zeiger auf den Namen des compilierten Textes
  69.      * Mit ES_ACK bestätigt der Editor die Meldung.
  70.      */
  71. #define SE_PROJECT 0x4206
  72.     /* Die Shell teilt dem Editor mit, daß das Projekt
  73.      * geändert wurde. Der Filename des aktuellen
  74.      * Projektfiles wird als Parameter übergeben
  75.      * Wort 3+4: Ein Zeiger auf den Namen des Projektfiles
  76.      * Der Editor bestätigt mit ES_ACK.
  77.      * Eine vernünftige Reaktion des Editors wäre es in dem Fall,
  78.      * ebenfalls das Projekt zu wechseln, sofern er diese unterstützt.
  79.      */
  80. #define SE_QUIT 0x4207
  81.     /* Die Shell teilt dem Editor mit, daß sie jetzt beendet wird.
  82.      * Der Editor sollte in dem Fall die Shell als Kommunikationspartner
  83.      * vergessen.
  84.      * Parameter gibt es keine.
  85.      * Es wird keine Antwort erwartet!
  86.      */
  87. #define SE_TERMINATE 0x4208
  88.     /* Die Shell teilt dem Editor mit, daß dieser sich beenden soll.
  89.      * Der Editor sollte in dem Fall sich selbst beenden und seinen ganz
  90.      * normalen Terminierungsprozeß durchlaufen (und in dem auch ein
  91.      * ES_QUIT schicken!). Der Grund für so eine Meldung der Shell könnte
  92.      * zum Beispiel zu wenig Speicher zum compilieren sein.
  93.      * Mit ES_ACK bestätigt der Editor die Meldung.
  94.      */
  95.  
  96. #define ES_INIT 0x4240
  97.     /* Ein Editor fragt an, ob eine Shell das SE-Protokoll versteht.
  98.      * Wort 3: Ein Bitset, welche Shellnachrichten verstanden werden
  99.      * Wort 4+5: Ein Bitset, welche Editorkommandos versendet werden
  100.      * Wort 6: Unterstütze Versionsnummer des Protokolls
  101.      * Als Antwort erhält es SE_OK von der Shell
  102.      */
  103. #define ES_OK 0x4241
  104.     /* Der Editor beantwortet die Anfrage der Shell nach dem Protokoll.
  105.      * Wort 3: Ein Bitset, welche Shellnachrichten verstanden werden
  106.      * Wort 4+5: Ein Bitset, welche Editorkommandos versendet werden
  107.      * Wort 6: Unterstütze Versionsnummer des Protokolls
  108.      * Wort 7: Die ApId des Programmes, dessen Nachricht beantwortet wird
  109.      */
  110. #define ES_ACK 0x4242
  111.     /* Der Editor bestätigt den Empfang des Kommandos
  112.      * Wort 3: TRUE: Kommando wird verstanden und ausgeführt.
  113.      *         FALSE: Das Kommando wird nicht verstanden
  114.      * Eine ES_ACK mit TRUE sagt nichts darüber aus, ob das Kommando erfolg-
  115.      * reich ausgeführt wurde. Es sagt nur, daß der Editor das Kommando
  116.      * versteht und ausführen wird!
  117.      */
  118. #define ES_COMPILE 0x4243
  119.     /* Der Editor sagt der Shell, daß sie ein File übersetzen soll.
  120.      * Ein Pointer auf den Dateinamen wird in der Message übergeben.
  121.      * Wort 3+4: Zeiger auf den Namen der zu compilierenden Datei.
  122.      * Diese Nachricht muß mit SE_ACK bestätigt werden.
  123.      */
  124. #define ES_MAKE 0x4244
  125.     /* Der Editor sagt der Shell, daß sie ein Make ausführen soll.
  126.      * Ein Filename kann in der Message übergeben werden, muß aber
  127.      * nicht gesetzt sein und muß von der Shell auch nicht beachtet
  128.      * werden!
  129.      * Wort 3+4: Zeiger auf den Namen des Makefiles (oder NULL)
  130.      * Die Shell bestätigt mit SE_ACK.
  131.      */
  132. #define ES_MAKEALL 0x4245
  133.     /* Der Editor sagt der Shell, daß ein komplettes Make All ausgeführt
  134.      * werden soll. Ein Filename für das Makefile kann (muß nicht) in
  135.      * der Message übergeben werden.
  136.      * Wort 3+4: Zeiger auf den Namen des Makefiles (oder NULL)
  137.      * Die Shell bestätigt mit SE_ACK.
  138.      */
  139. #define ES_LINK 0x4246
  140.     /* Der Editor sagt der Shell, daß das Programm
  141.      * gelinkt werden soll. Ein Filename kann
  142.      * in der Message übergeben werden, muß aber
  143.      * nicht unbedingt beachtet werden von der Shell!
  144.      * Wort 3+4: Zeiger auf den Namen der Source, die gelinkt werden soll
  145.      *           (oder NULL)
  146.      * Die Shell bestätigt mit SE_ACK.
  147.      */
  148. #define ES_EXEC 0x4247
  149.     /* Der Editor sagt der Shell, daß das Programm
  150.      * zu der Source ausgeführt werden soll. Ein
  151.      * Filename kann übergeben werden, muß von der
  152.      * Shell aber nicht beachtet werden.
  153.      * Wort 3+4: Zeiger auf den Namen des auszuführenden Files (oder NULL)
  154.      *           Bei einer Sourcedatei ist diese ggf. noch zu
  155.      *           compilieren und/oder zu linken
  156.      * Die Shell bestätigt mit SE_ACK.
  157.      */
  158. #define ES_MAKEEXEC 0x4248
  159.     /* Die Shell soll ein Make ausführen und danach das Programm ausführen.
  160.      * Ein Filename für das Makefile kann (muß nicht) in der Message
  161.      * übergeben werden.
  162.      * Wort 3+4: Zeiger auf den Namen des Makefiles (oder NULL)
  163.      * Die Shell bestätigt mit SE_ACK.
  164.      */
  165. #define ES_PROJECT 0x4249
  166.     /* Der Editor teilt der Shell mit, daß das Project
  167.      * geändert/gewechselt wurde. Der Filename des
  168.      * Projektfiles wird als Parameter in der Message
  169.      * übergeben.
  170.      * Wort 3+4: Zeiger auf den Namen des Projektfiles
  171.      * Die Shell bestätigt mit SE_ACK.
  172.      * Eine vernünftige Reaktion der Shell wäre in dem Fall, ebenfalls
  173.      * das Projekt zu wechseln, sofern es diese unterstützt.
  174.      */
  175. #define ES_QUIT 0x424A
  176.     /* Der Editor teilt der Shell mit, daß er jetzt beendet wird.
  177.      * Die Shell sollte in dem Fall den Editor als Kommunikationspartner
  178.      * vergessen.
  179.      * Parameter gibt es keine.
  180.      * Es wird keine Antwort erwartet!
  181.      */
  182.  
  183. #define SE_DATA 0
  184.     /* Nur für Typdeklaration benutzt, eigentlich überflüssig
  185.      */
  186.  
  187. #define SEPROTOVERSION 0x0100 /* Die Versionsnummer des Protokolls.
  188.                                * Highbyte ist die Major Number
  189.                                * Lowbyte ist die Lower Number
  190.                                */
  191.  
  192. /* Typdefinitionen für die Nachrichten
  193.  */
  194.  
  195. /* Dies definiert die einzelnen Bits, welche Nachrichten unterstützt werden
  196.  */
  197. #define seInit     0x0001
  198. #define seOk       0x0002
  199. #define seAck      0x0004
  200. #define seOpen     0x0008
  201. #define seError    0x0010
  202. #define seErrfile  0x0020
  203. #define seProject  0x0040
  204.  
  205. #define esInit     0x0001
  206. #define esOk       0x0002
  207. #define esAck      0x0004
  208. #define esCompile  0x0008
  209. #define esMake     0x0010
  210. #define esMakeall  0x0020
  211. #define esLink     0x0040
  212. #define esExec     0x0080
  213. #define esMakeexec 0x0100
  214. #define esProject  0x0200
  215.  
  216. typedef struct
  217. {
  218.    char *errfile; /* Zeiger auf den Namen der compilierten Datei */
  219.    char *errmess; /* Zeiger auf die Fehlermeldung */
  220.    WORD  errnum;  /* Die Fehlernummer */
  221.    WORD  errcol;
  222.    LONG  errline;
  223. }ERRINFO;
  224.  
  225. /*
  226. TYPE    tShellCommands = (seInit, seOk, seAck, seOpen, seError, seErrfile,
  227.                           seProject);
  228.  
  229.         tEditCommands  = (esInit, esOk, esAck, esCompile, esMake, esMakeall,
  230.                           esLink, esExec, esMakeexec, esProject);
  231.  
  232.         tPtrString  = POINTER TO ARRAY [0..255] OF CHAR;
  233.         /* Zeiger auf einen nullterminierten String
  234.          */
  235.  
  236.         LONGBITSET  = SET OF [0..31];
  237.         /* Leider kennt das nicht jeder Compiler
  238.          */
  239.  
  240.         tErrInfo     = RECORD
  241.                         errFile : tPtrString;
  242.                         /* Zeiger auf den Namen der compilierten Datei
  243.                          */
  244.                         errMess : tPtrString;
  245.                         /* Zeiger auf die Fehlermeldung
  246.                          */
  247.                         errNum  : INTEGER;
  248.                         /* Die Fehlernummer
  249.                          */
  250.                       END;
  251.         tPtrErrInfo = POINTER TO tErrInfo;
  252.  
  253.  
  254.         /* Über diese Recorddefinition kann man alle
  255.          * Messages des Protokolls behandeln
  256.          */
  257.  
  258.         tMessRec    = RECORD
  259.                         msg     : INTEGER;
  260.                         /* Messagenummer, Wort 0 */
  261.                         apId    : INTEGER;
  262.                         /* Applikation ID des Senders, Wort 1 */
  263.                         overLen : INTEGER;
  264.             /* Überlänge der Nachricht (immer 0 für SE-Protokoll), Wort 2 */
  265.                         CASE : CARDINAL OF
  266.                           SE_INIT,
  267.                           ES_INIT   : shellBits: BITSET;
  268.                           /* Bits, die angeben, welche Shell-Nachrichten
  269.                            * unterstützt werden (Wort 3)
  270.                            */
  271.                                       editBits : LONGBITSET;
  272.                           /* Bits, die angeben, welche Editor-Nachrichten
  273.                            * unterstützt werden (Worte 4 und 5)
  274.                            */
  275.                                       version  : CARDINAL;
  276.                           /* Unterstütze Versionsnummer des Protokolls
  277.                            * Aktuell: $100
  278.                            */
  279.                         | SE_OK,
  280.                           ES_OK     : okShellBits: BITSET;
  281.                           /* Bits, die angeben, welche Shell-Nachrichten
  282.                            * unterstützt werden (Wort 3)
  283.                            */
  284.                                       okEditBits : LONGBITSET;
  285.                           /* Bits, die angeben, welche Editor-Nachrichten
  286.                            * unterstützt werden (Worte 4 und 5)
  287.                            */
  288.                                       okVersion: CARDINAL;
  289.                           /* Unterstütze Versionsnummer des Antwortenden
  290.                            * Aktuell: $100
  291.                            */
  292.                                       otherId  : INTEGER;
  293.                           /* Die ApId des Senders, auf das dies eine Antwort
  294.                            * ist (Wort 7)
  295.                            */
  296.                         | SE_ACK,
  297.                           ES_ACK    : acknowledge:  BOOLEAN;
  298.                           /* TRUE: Kommando wurde akzeptiert,
  299.                            * FALSE: Kommando konnte nicht ausgeführt werden
  300.                            */
  301.                         | SE_OPEN   : namePtr   : tPtrString;
  302.                           /* Zeiger auf den Namen des zu ladenden Textes
  303.                            * (Worte 3 und 4)
  304.                            */
  305.                         | SE_ERROR  : errorPtr  : tPtrErrInfo;
  306.                           /* Zeiger auf Speicherbereich, der die
  307.                            * Fehlermeldung spezifiziert.
  308.                            */
  309.                                       errorRow  : INTEGER;
  310.                           /* Die Spalte, in der der Fehler aufgetreten ist
  311.                            * (Wort 5)
  312.                            */
  313.                                       errorLine : LONGINT;
  314.                           /* Die Zeile, in der der Fehler aufgetreten ist
  315.                            * (Worte 6 und 7)
  316.                            */
  317.                         | SE_ERRFILE : errPtr   : tPtrString;
  318.                           /* Zeiger auf den Namen des Errorfiles */
  319.                                        fnamePtr : tPtrString;
  320.                           /* Zeiger auf den Namen der compilierten Datei */
  321.                         | SE_PROJECT,
  322.                           ES_COMPILE,
  323.                           ES_MAKE,
  324.                           ES_MAKEALL,
  325.                           ES_LINK,
  326.                           ES_EXEC,
  327.                           ES_MAKEEXEC,
  328.                           ES_PROJECT : filePtr  : tPtrString;
  329.                           /* Zeiger auf den Filenamen des Files, welches
  330.                            * behandelt werden soll
  331.                            */
  332.                         | SE_QUIT,
  333.                           SE_TERMINATE,
  334.                           ES_QUIT,
  335.                           SE_DATA:     data     : ARRAY [0..4] OF INTEGER;
  336.                           /* Definition für Maximallänge des Records
  337.                            */
  338.                         END;
  339.                       END;
  340.  
  341.         tPtrMessRec = POINTER TO tMessRec;
  342.         /* Ein Zeiger auf diese Messageblock
  343.          */
  344. */
  345.  
  346.  
  347.